PROJET 3 - Concevez une application au service de la santé publique - Analyse exploratoire du jeu de données nettoyé Open Food Facts

Auteur : Henrique Da Costa - Parcours Data scientist chez Openclassrooms

Plan de l'analyse :

1. IDEE D'APPLICATION

Le Nutri-Score, cible de notre application

Dans le cadre de la loi de Santé de 2016, le gouvernement français a recommandé la mise en place d’une information nutritionnelle claire, visible, et facile à comprendre pour tous. L’objectif : améliorer l’information nutritionnelle figurant sur les produits et ainsi aider les consommateurs à acheter des aliments de meilleure qualité nutritionnelle. Valeur énergétique des produits, teneurs en graisses, acides gras saturés, glucides, sucres, protéines et sel pour 100 g ou 100 ml de produit : les informations y sont nombreuses.

Le Nutri-Score, grâce à une lettre et à une couleur, informe les consommateurs sur la qualité nutritionnelle d’un produit. Chaque produit est ainsi positionné sur une échelle à 5 niveaux allant :

  1. du produit le plus favorable sur le plan nutritionnel (classé A)
  2. au produit le moins favorable sur le plan nutritionnel (classé E)

Cette graduation est attribuée en fonction de la composition du produit. Plus le produit contiendra de fibres, protéines et végétaux, plus sa classification tendra vers le A.

A l’inverse, plus celui-ci contiendra d’énergie, de sel, de sucre et d’acides gras saturés (AGS), plus sa classification tendra vers le E.

Tous les produits transformés et les boissons sont concernés par le Nutri-Score sauf quelques produits comme le thé, le café ou les herbes aromatiques. De même, les fruits, légumes et poissons frais ne sont pas concernés, ainsi que l'alcool.

Pour classer chaque produit, des équipes de recherches internationales ont mis au point un score qui prend en compte, pour 100 grammes de produit, la teneur :

  1. en nutriments et aliments à favoriser : fibres, protéines, fruits et légumes
  2. en nutriments à limiter : énergie, acides gras saturés, sucres, sel

Après calcul, le score obtenu par un produit permet de lui attribuer une couleur et une lettre.

Score final Couleur Lettre
Entre - 15 et - 2 Vert A
Entre - 1 et + 3 Vert clair B
Entre + 4 et + 11 Jaune C
Entre + 12 et + 16 Orange D
Entre +17 et + 40 Rouge E

les catégories de produits sont définies par le Pogramme National de Nutrition Santé (https://www.mangerbouger.fr/PNNS), ou PNNS, qui propose depuis 2001 des recommandations nutritionnelles pour prévenir l’apparition de certaines maladies et promouvoir la santé publique.

Idée d'application => Prédire le nutriscore à partir de certains éléments nutritionnels de base

image.png

L'idée est de réaliser une application qui aide le consommateur à améliorer ses habitudes de consommation.

Connaissant la teneur en nutriments à éviter et le taux de protéines (nutriment favorable à la santé et à la pratique du sport amateur), l'idée est de permettre à tout un chacun et au sportif amateur en particulier de savoir si un aliment possède un score favorable à une bonne santé ou au contraire est à bannir.

La connaissance du nutri-score de l’aliment permet de contrôler ce qu’on mange.

Cette connaissance est fournie par un modèle prédictif estimant le nutriscore de l'aliment à partir de la composition de ces quelques nutriments de base dans une fourchette de - 15 (aliment le plus sain) à + 40 (aliment le moins sain) et de traduire cela par une lettre de A (le plus favorable) à E (à éviter absolument).

L'objectif est de mettre au point une application légère permettant d’avoir une visualisation rapide du nutriscore pour manger de manière saine.

Cette application aurait vocation à être déployé sur PC et sur mobile.

2. IMPORT DES DONNEES ET PARAMETRES D'AFFICHAGE

Paramètres d'affichage

Chargement du fichier de données

3. ANALYSE UNIVARIEE

Les analyses univariées et multivariées seront menées grâce à la librairie DataPrep.EDA qui permet d'obtenir des statistiques exhaustives et des visualisations de différentes natures.

Valeurs manquantes pour mémoire

Le jeu de données est exploitable en l'état car comportant trés peu de valeurs manquantes sauf pour la variable Fiber que l'on choisit de conserver à ce stade car c'est un élément important pour un nutriscore de qualité.

Remplacer les valeurs manquantes avec l'algorithme k Nearest Neighbors (k-NN) qui peut servir autant pour la regression que la classification

L’imputation dans Scikit-learn -> Pour information

Trois types d’imputeurs sont disponibles à l’heure actuelle : le SimpleImputer, qui implémente des stratégies classiques d’imputation univariée, le KNNImputer, qui implémente la stratégie par k-plus proches voisins, et l”IterativeImputer qui implémente à titre expérimental l’imputation itérative.

Scikit-learn gère (de façon expérimentale) l’imputation itérative. Pour l’utiliser, il est nécessaire d’activer le mode expérimental de scikit-learn :

from sklearn.experimental import enable_iterative_imputer

from sklearn.impute import IterativeImputer

Sauvegarde fichier df_knn

Nous avons retraité ici uniquement les variables numeriques constituées des éléments nutritifs impactant directement le nutriscore_score. L'algorithme k-NN nous a surtout servi à imputer les valeurs manquantes pour la variable 'fiber', les autres variables présentant trés peu de valeurs manquantes avant le traitement.

Nous reviendrons ultérieurement si besoin sur les variables catégorielles : pnns_groups_1 et pnns_groups_2. Parmi celles-ci seule pnnss_groups_1 présente un taux de valeurs manquantes de 25.37 %, l'autre variable ne rencontrant aucune valeur manquante.

Comparons à présent la distribution du jeu de données avant et aprés le traitement des valeurs manquantes.

Distribution des variables avant traitement des valeurs manquantes

Distribution des variables aprés traitement des valeurs manquantes

Regarder la tendance centrale et la dispersion de chaque variable avant et après le nettoyage (comparaison)

Compte tenu du faible taux de valeurs manquantes pour l'ensemble des variables (hormis le 'fiber_100g'), les distributions et les différents indicateurs statistiques sont quasiment identiques. S'agissant de 'fiber_100g' :

Indicateur Avant traitement Aprés traitement
Moyenne 2.61 1.78
Variance 15.25 9.10
Ecart-type 3.90 3.01
Skew 5.52 6.03
Kurtosis 63.93 81.15

Nous allons poursuivre notre étude avec la variable 'fiber_100g' ainsi corrigé des valeurs manquantes. Si de forts biais devaient persister, nous la retirerions.

Synthèse de l'analyse univariée

Les 3 premiers groupes ont une distribution décalée vers la droite tandis que le dernier (nutriscore) présente une distribution bimodale.

Il existe plusieurs tests pour affirmer la normalité d'une distribution. Tous ces tests ont en commun d'avoir comme hypthèse nulle: La distribution empirique suit une loi Gaussienne.

Test de Shapiro-Wilk

Un des tests permettant de vérifier la normalité de la variable x est le test de Shapiro-Wilk. Il est appliquable pour des échantillons allant jusqu'à 50 valeurs. Il utilise le rapport de deux estimations de la variance. Dans le cas d'une variable normale, ces deux estimations coïncident et le rapport est voisin de 1, alors que si la variable n'est pas normale le rapport est plus petit que 1. => Pas utilisé ici car le volume du jeu de données est trop grand.

Test de Kolmogorov-Smirnov

Le test de Kolmogorov-Smirnov permet de tester l'ajustement des données x à n'importe quelle loi, dont la loi normale. Il est intéressant d'opter pour ce test plutôt que celui de Shapiro-Wilk en cas de très grands échantillons. Ce test détermine si les observations d'un échantillon peuvent raisonnablement provenir d'une distribution théorique donnée.

Test K ^2 de D’Agostino-Pearson

Le test K ^2 de D’Agostino-Pearson est considéré comme plus puissant que le test de Kolmogorov-Smirnov. Il se base sur le coefficient d’asymétrie (appelé également coefficient of Skewness ou coefficient \beta_1 de Pearson) et d’aplatissement (appelé également coefficient of Kurtosis ou coefficient \beta_2 de Pearson).

Test d'Anderson-Darling

Le test d'Anderson-Darling est une variante du test de Kolmogorov-Smirnov pour l'hypothèse nulle où un échantillon est tiré d'une population qui suit une distribution particulière. Il est plus sensible que le test de Kolmogorov-Smirnov aux valeurs extrêmes.

Les différents test statistiques confirment que la distribution de chacune de nos variables ne suit pas une loi normale. Il conviendra d'en tenir compte dans l'utilisation des différents modèles déployés.

4. ANALYSE BIVARIEE

Pour mémoire, on repart bien avec un jeu de données ne contenant aucune valeur manquante.

Comme l'on pouvait le présumer, 'salt' et 'sodium' sont parfaitement corrélés. On retirera donc la variable 'sodium' de notre jeu de données dans la suite de notre analyse.

Corrélation entre les différentes variables

Dés lors que l’on analyse des données il est important (particulièrement si vous faites du Machine Learning) de détecter si vos variables (features) sont liées.

En probabilités et en statistique, la corrélation entre plusieurs variables aléatoires ou statistiques est une notion de liaison qui contredit leur indépendance.

Les coefficients de Pearson (r) montrent une corrélation positive (r>0), négative (r<0) ou l'absence de corrélation (r=0).

Toutes les relations de dépendances ne sont pas forcément linéaires, il va donc falloir pousser plus loin les régressions (polynomiale, etc.). On étudie la corrélation de Spearman quand deux variables statistiques semblent corrélées sans que la relation entre les deux variables soit de type affine. Elle consiste à trouver un coefficient de corrélation, non pas entre les valeurs prises par les deux variables mais entre les rangs de ces valeurs. Elle estime à quel point la relation entre deux variables peut être décrite par une fonction monotone.

Cette mesure permet de mesurer l’association entre deux variables. Plus spécifiquement, le tau de Kendall mesure la corrélation de rang entre deux variables.

Tau de Kendall: renvoie des valeurs généralement inférieures à la corrélation rho de Spearman. Les calculs sont basés sur des paires concordantes et discordantes. Cette méthode est insensible à l’erreur. Les valeurs sont plus précises avec des échantillons plus petits.

Rho de Spearman: donne des valeurs généralement plus grandes que le Tau de Kendall. Les calculs sont basés sur les déviations. il est beaucoup plus sensible aux erreurs et aux divergences dans les données (outliers).

Il apparaît que 'fiber' n'est absolument pas corrélée avec 'nutriscore_score' contrairement à ce que l'on pouvait présupposer. C'est contre-intuitif. Rappelons que 'fiber' présentaint environ 2/3 de valeurs manquantes. Esayons de voir dans l'hypothèse où l'on réduit le jeu de données de telle sorte que ne soient conservées que les lignes pour lesquelles 'fiber' est renseigné, si la corrélation 'fiber'/'nutriscore' est avérée ou pas.

Il s'avère que la corélation de 'fiber' avec 'nutriscore' n'est pas davantage avérée. Nous écarterons donc pour la suite de notre étude cette variable.

Vecteur de corrélation pour la variable 'nutriscore_score'

Comme nous nous intéresssons spécifiquement aux corrélations avec la variable de 'nutriscore_score', nous allons projeter la matrice de corrélations sur cette seule variable afin d'obtenir un "vecteur de corrélation".

En analysant ce vecteur de corrélation, nous pouvons constater que le score de nutrition est positivement corrélé à :

Corrélé dans une moindre mesure à :

Et pas corrélé avec :

Cela est cohérent avec le fait qu'un aliment est d'autant meilleur pour la santé que son score de nutrition est bas.

Test d'indépendance entre la cible 'nutriscore_score' et chacune des variables retenues

Test du Chi2
Test selon corrélation de Pearson
Test selon corrélation de rang de Spearman
Test selon corrélation de rang de Kendall

En conclusion : les différents tests effectués nous donnent une assurance raisonnable que les couples de variables ('nutriscore_score', variable retenue) sont dépendants.

Au terme de notre analyse bivariée, nous retirons de notre jeu de données les variables 'fiber_100g' et 'sodium_100g'

Nous nous retrouvons ainsi avec 7 variables explicatives du nutriscore.

Sauvegarde du fichier épuré au terme de l'analyse bivariée

5. ANALYSE MULTIVARIEE - ACP

Il apparaît difficile à ce point de notre étude de réduire encore plus le nombre de variables. Voyons néanmoins ce que nous livre l'analyse en composantes principales (ACP).

Les fonctions pour afficher le cercle des corrélations et les projections sur les plans factoriels se trouvent dans le fichier functions.py.

Étudions les corrélations entre les variables initiales et les composantes principales

Rappelons que la projection de la flèche (représentant la variable v ) sur un axe principal (représentant une composante principale) correspond au coefficient de corrélation entre v et cet axe.

Nous observons que :

Pour mémoire, Le nombre maximal de composantes d’une ACP sera le minimum entre p (le nombre de variables) et n-1 (le nombre d'individus -1).

Ici, le maximun sera donc de 7.

En ACP, on projette les données sur les axes principaux d’inertie, et ceux-ci sont ordonnés selon l’inertie du nuage projeté : de la plus grande à la plus petite.

Quand on additionne les inerties associées à tous les axes, on obtient l’inertie totale du nuage des individus.

On peut donc afficher un diagramme qui décrit le pourcentage d’inertie totale associé à chaque axe : Ebouli des valeurs propres.

Un échantillon sans aucune structure est un échantillon pour lequel les variables n’ont aucune corrélation entre elles : elles sont toutes indépendantes deux à deux.

L’extrême inverse serait un échantillon pour lequel toutes les variables sont corrélées deux à deux avec un coefficient de corrélation de 1. C’est le cas où tous les points sont parfaitement alignés. Comme tous les points sont alignés, il n’y a besoin que d’un seul axe pour capter 100 % de l’inertie totale : il suffit de le placer dans l'alignement des points !

Ici, les 2 premiers plans factoriels (composantes principales PC1, PC2, PC3, PC4) représentent prés de 90 % de l'inertie totale. On pourrait donc se contenter d'analyser les 4 premières composantes principales, ce qui constituerait une réduction de nos dimensions de 42 % (de 7 à 4).

Choix des composantes principales

Nous vérifions que la somme des valeurs propres correspond au nombre de variables, soit 7.

La règle de Kaiser repose sur une idée simple. Dans une ACP normée, la somme des valeurs propres étant égale au nombre de variables, leur moyenne vaut 1. Nous considérons par conséquent qu'un axe est intéressant si sa valeur propre est supérieur à 1. Selon cette règle, nous ne retiendrions que les 2 premiers axes.

Sur l'éboulis des valeurs propres, on observe un décrochement sur l'axe 3. Ce critère nous conduit également à ne retenir que les 2 premiers axes situés avant le décrochement.

L'application de ces 2 critères nous conduit à retenir les axes PC1 et PC2 qui expliquent à eux deux prés de 65 % de l'inertie totale. Ajoutons néanmoins les 2 axes suivants pour expliquer un taux d'inertie plus important à 89.3 %. Ce faisant, nous réduisons nos dimensions de 7 variables initiales à 4 composantes principales.

Sauvegarde du fichier DataFrame_pca

6. PREDICTION DU NUTRISCORE A PARTIR DES COMPOSANTES PRINCIPALES PC1 A PC4

PyCaret est une bibliothèque d'apprentissage automatique open source à faible code en Python qui automatise les flux de travail d'apprentissage automatique. Il s'agit d'un outil d'apprentissage automatique et de gestion de modèles de bout en bout qui accélère le cycle d'expérimentation de manière exponentielle et rend plus productif.

En comparaison avec les autres bibliothèques d'apprentissage automatique open source, PyCaret est une bibliothèque alternative low-code qui peut être utilisée pour remplacer des centaines de lignes de code par quelques mots seulement. Cela rend les expériences exponentiellement rapides et efficaces. PyCaret est essentiellement un wrapper Python autour de plusieurs bibliothèques et frameworks d'apprentissage automatique tels que scikit-learn, XGBoost, LightGBM, CatBoost, spaCy, Optuna, Hyperopt, Ray et bien d'autres.

Choix du modele

Pycaret nous aide à mieux cibler les modèles d'apprentissage les plus adaptés à notre jeu de données. Dans notre application, les modèles Extra Trees Regressor et Random Forest Regressor semblent les plus appropriés. Extra Trees et Random Forest sont en fait deux méthodes d'ensemble très similaires. Les méthodes d'ensemble d' arbres sont meilleures que les simples arbres de décision.

Forest Random utilise des réplicas bootstrap , c'est-à-dire qu'elle sous-échantillonne les données d'entrée avec remplacement, tandis que Extra Trees utilise l'ensemble de l'échantillon d'origine.

Une autre différence est la sélection des points de coupe afin de diviser les nœuds. Random Forest choisit la répartition optimale tandis que Extra Trees la choisit au hasard . Cependant, une fois les points de partage sélectionnés, les deux algorithmes choisissent le meilleur parmi tous les sous-ensembles d'entités. Par conséquent, Extra Trees ajoute la randomisation mais dispose toujours d'une optimisation.

Ces différences motivent la réduction à la fois du biais et de la variance. D'une part, l'utilisation de l'ensemble de l'échantillon d'origine au lieu d'une réplique bootstrap réduira le biais. D'un autre côté, choisir au hasard le point de partage de chaque nœud réduira la variance.

En termes de coût de calcul, et donc de temps d'exécution, l'algorithme Extra Trees est plus rapide . Cet algorithme fait gagner du temps car toute la procédure est la même, mais il choisit au hasard le point de partage et ne calcule pas le point optimal.

MODELE RANDOM FOREST

MODELE EXTRA TREES REGRESSOR

CONCLUSION SUR LA PERTINENCE DE CES 2 MODELES

Nous nous appuyons sur 2 indicateurs pour porter un jugement sur la préférence d'une méthode par rapport à l'autre :

image.png

image.png

Indicateur Random Forest Extra Trees
RMSE 2.82 2.81
R2 entraînement 0.98 0.99
R2 test 0.89 0.90

Ces deux modèles sont effectivement extrêmement proches avec une trés légère préférence pour Extra Trees Regressor.

7. ANNEXE - CHOIX DU MODELE A PARTIR DES VARIABLES INITIALES - MESURE DE LA PERTE DE PERFORMANCE AVEC LES COMPOSANTES PRINCIPALES

Choix du modèle

Random Forest Regressor

Comparaison effectuée sur le modele Random Forest Regressor

Indicateur Composantes principales Variables initiales
RMSE 2.82 2.34
R2 entraînement 0.98 0.98
R2 test 0.89 0.93

Perte légère de performance avec les composantes principales sur le R2 en test.